/**
  * @File: ClipboardMonitor.h
  *
  * @Author: Bob 
  *
  * @Date: 2016/09/08 
  *
  * @Version: 1.0
  *
  * @Last Modify By: Bob
  *
  * @Last Modify Time: 2016/09/08 
  *
  * @Description:
  *		 开发工具：VS2013
  *
  */

#ifndef _CLIPBOARDMONITOR_H
#define _CLIPBOARDMONITOR_H

#include <windows.h>
#include <string>

// BMP图片24位真彩色
#define BMP_PIXEL_24 (24)
// BMP图片32位彩色
#define BMP_PIXEL_32 (32)


// 保存复制的文本
const std::string TXT_FILE_NAME = "-text.txt";

// 保存截图文件
const std::string BMP_FILE_NAME = "-image.bmp";


class ClipboardMonitor
{
public:
	/**************************************************************************
	 * @Function: ClipboardMonitor
	 * @Description:
	 *		默认构造函数
	 *************************************************************************/
	ClipboardMonitor();


	/**************************************************************************
	 * @Function: ~ClipboardMonitor
	 * @Description:
	 *		析构函数
	 *************************************************************************/
	virtual ~ClipboardMonitor();


	/**************************************************************************
	 * @Function: GetInstance
	 * @Return: 返回当前实例的指针
	 * @Description:
	 *		获取一个单实例
	 *************************************************************************/
	static ClipboardMonitor* GetInstance();

	/**************************************************************************
	 * @Function: Initi
	 * @Return: 无
	 * @Description:
	 *		初始化函数，调用函数CreateADaemoWindow
	 *************************************************************************/
	void Init();


	/**************************************************************************
	 * @Function: CreateADaemoWindow
	 * @Return: 失败返回FALSE，成功返回TRUE
	 * @Description:
	 *      创建一个大小为0的窗口，通过调用windows API SetClipboardViewer，将窗口
	 *		句柄添加到窗口链，实现对于剪贴板内容变化消息的监控
	 *************************************************************************/
	BOOL CreateADaemoWindow();


	/**************************************************************************
	 * @Function: IsClipboardOwnerMySelf
	 * @Param1[IN]: hMySelfWnd 自身窗口句柄
	 * @Param2[IN]: hClipboardWnd 剪贴板拥有者窗口句柄
	 * @Return: 如果两个窗口句柄一直返回TRUE，否则返回FALSE
	 * @Description:
	 *		判断自身窗口是不是剪贴板拥有者
	 *************************************************************************/
	BOOL IsClipboardOwnerMySelf(HWND hMySelfWnd, HWND hClipboardWnd);


	/**************************************************************************
	 * @Function: DaemoWindowDlgProc
	 * @Description:
	 *		窗口过程处理的回调函数，主要处理剪贴板内容发生变化的消息WM_DRAWCLIPBOARD，
	 *		以及延时提交消息WM_RENDERFORMAT
	 *************************************************************************/
	static BOOL CALLBACK DaemoWindowDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);


	/**************************************************************************
	 * @Function: GenerateFileName
	 * @Param1[IN]: uClipboardDataFromat 剪贴板数据类型(CF_TEXT,CF_BITMAP, CF_DIB等)
	 * @Return: 返回拼接完成的文件名
	 * @Description:
	 *		根据剪贴板数据类型拼接文件名，为保证每次保存的文件名不同这里引入了GUID
	 *************************************************************************/
	std::string GenerateFileName(UINT uClipboardDataFromat);


	/**************************************************************************
	 * @Function: GetApplicationExName
	 * @Param1[IN]: hWnd 窗口程序的句柄
	 * @Return: 返回窗口程序的可执行文件名
	 * @Description:
	 *		根据窗口句柄获取对应的可执行文件名
	 *************************************************************************/
	std::string GetApplicationExName(HWND hWnd);


	/**************************************************************************
	 * @Function: SaveTextDataToFile
	 * @Param1[IN]: uClipboardDataFromat 剪贴板数据类型，这里为CF_TEXT
	 * @Param2[IN]: pFilePath  文件路径
	 * @Return: 成功返回TRUE，失败返回FALSE
	 * @Description:
	 *		获取剪贴板中的文本内容，调用函数WriteTextFile保存到文件
	 *************************************************************************/
	BOOL SaveTextDataToFile(UINT uClipboardDataFromat, const char* pFilePath);


	/**************************************************************************
	 * @Function: WriteTextFile
	 * @Param1[IN]: pContent 剪贴板文本数据
	 * @Param2[IN]: dwSize 数据大小
	 * @Param3[IN]: pFilePath  文件路径
	 * @Return: 成功返回TRUE，失败返回FALSE
	 * @Description:
	 *		将获取出来的剪贴板文本写入到文件
	 *************************************************************************/
	BOOL WriteTextFile(char* pContent, DWORD dwSize, const char* pFilePath);


	/**************************************************************************
	 * @Function: WriteBMPDateToFile
	 * @Param1[IN]: hBitmap 位图句柄
	 * @Param2[IN]: pFilePath 文件路径
	 * @Return: 成功返回TRUE，失败返回FALSE
	 * @Description:
	 *		将位图写入文件
	 *************************************************************************/
	BOOL WriteBMPDateToFile(HBITMAP hBitmap, const char* pFilePath);


	/**************************************************************************
	 * @Function: SaveBMPDataToFile
	 * @Param1[IN]: uClipboardDataFromat 剪贴板数据类型，这里为CF_BITMAP或者CF_DIB
	 * @Param2[IN]: pFilePath 文件路径
	 * @Return: 成功返回TRUE，失败返回FALSE
	 * @Description:
	 *		获取剪贴板中的位图数据
	 *************************************************************************/
	BOOL SaveBMPDataToFile(UINT uClipboardDataFromat, const char* pFilePath);


	/**************************************************************************
	 * @Function: SaveDataToFile
	 * @Param1[IN]: hClipboardOwnerWnd 剪贴板数据拥有者窗口句柄
	 * @Return: 成功返回TRUE，失败返回FALSE
	 * @Description:
	 *		保存剪贴板数据到文件
	 *************************************************************************/
	BOOL SaveDataToFile(HWND hClipboardOwnerWnd);

};

/// 一个用于获取单实例的宏
#define ClipboardMonitorInstance  ClipboardMonitor::GetInstance()

#endif /* end of _CLIPBOARDMONITOR_H */